package com.yupi.springbootinit.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yupi.springbootinit.model.dto.processsheet.ProcessSheetAddRequest;
import com.yupi.springbootinit.model.dto.processsheet.ProcessSheetQueryRequest;
import com.yupi.springbootinit.model.dto.processsheet.ProcessSheetUpdateRequest;
import com.yupi.springbootinit.model.dto.processsheet.ProcessSheetExcelStepDTO;
import com.yupi.springbootinit.model.entity.ProcessSheet;
import com.yupi.springbootinit.model.entity.User;
import com.yupi.springbootinit.model.vo.ProcessSheetVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * 工艺单服务
 */
public interface ProcessSheetService extends IService<ProcessSheet> {

    /**
     * 从任务创建工艺单
     */
    Long createProcessSheetFromTask(String taskId, ProcessSheetAddRequest request, User user);


    /**
     * 创建工艺单（含明细），并在成功后完结对应的工程部待办
     */
    Long createWithSteps(ProcessSheetAddRequest request, Long creatorId, String creatorName, Long departmentId);

    /**
     * 校验工艺单
     *
     * @param processSheet 工艺单
     * @param add          是否为创建校验
     */
    void validProcessSheet(ProcessSheet processSheet, boolean add);

    /**
     * 获取查询包装类
     *
     * @param processSheetQueryRequest 查询请求
     * @return 查询包装类
     */
    QueryWrapper<ProcessSheet> getQueryWrapper(ProcessSheetQueryRequest processSheetQueryRequest);

    /**
     * 获取工艺单封装
     *
     * @param processSheet 工艺单
     * @return 工艺单封装
     */
    ProcessSheetVO getProcessSheetVO(ProcessSheet processSheet);

    /**
     * 分页获取工艺单封装
     *
     * @param processSheetPage 工艺单分页
     * @return 工艺单封装分页
     */
    Page<ProcessSheetVO> getProcessSheetVOPage(Page<ProcessSheet> processSheetPage);

    /**
     * 更新工艺单（含明细）
     */
    boolean updateWithSteps(ProcessSheetUpdateRequest request, Long updaterId, String updaterName);

    /**
     * 根据来源订单ID获取工艺单
     */
    ProcessSheet getBySourceId(Integer sourceType, Long sourceId);

    /**
     * 处理工艺单发布后的业务逻辑
     */
    void handleProcessSheetPublished(Long salesOrderId, String orderNumber, String productCode, Long creatorId, String creatorName);

    /**
     * 检查用户是否有权限创建指定销售订单的工艺单
     */
    boolean checkCreatePermission(Long salesOrderId, Long userId);

    /**
     * 解析工艺卡 Excel，提取“工序说明”“检验要求”两列，返回步骤列表（不落库，用于表单回填）
     */
    List<ProcessSheetExcelStepDTO> parseProcessSheetExcel(MultipartFile file);

    /**
     * 解析磁盘上的 Excel 文件（结合附件上传后再解析的场景）
     */
    List<ProcessSheetExcelStepDTO> parseProcessSheetExcel(java.io.File file, String originalFilename);

    /**
     * 根据产品名称查询工艺单信息（用于新建时自动填充工艺单号）
     */
    Map<String, Object> queryProcessSheetByProductName(String productName);

    /**
     * 根据订单ID获取工艺单ID
     */
    Long getProcessSheetIdByOrderId(Long orderId, Integer sourceType);
}
